package javao.cn.work.orc.utils.orc;

import lombok.extern.slf4j.Slf4j;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;

/**
 * 使用Tess4J光学文字识别，提取文件中字符串
 */
@Slf4j
@Component
public class OcrUtils {

    private final Tesseract tesseract;

    @Value("${tess4j.default-language}")
    private String language;

    @Value("${tess4j.default-tessdata}")
    private String tessdata;


    public OcrUtils() {
        tesseract = new Tesseract();
        // 设置 Tesseract OCR 引擎的数据路径
        tesseract.setDatapath("tessdata");
        // 设置识别语言
        tesseract.setLanguage(language);
        //设置默认的语言库
        tesseract.setDatapath(tessdata);
        //设置图像DPI
        tesseract.setTessVariable("user_defined_dpi","300");
    }

    public synchronized String extractText(File imageFile) {
        try {
            return tesseract.doOCR(imageFile);
        } catch (TesseractException e) {
            e.printStackTrace();
            return "Error: " + e.getMessage();
        }
    }

    /**
     * 识别PDF指定位置的文字
     * @param imageFile 图片
     * @param region 指定位置
     * @return 提取到的文本
     */
    public synchronized String performOCRByRegion(File imageFile, Rectangle region) {
        String extractedText = "";
        try {
            extractedText = tesseract.doOCR(imageFile, region);
        } catch (Exception e) {
            e.printStackTrace();
        }
        extractedText.replace("\n","");
        return extractedText;
    }

    /**
     * 识别PDF指定位置的文字
     * @param bufferedImage 图片
     * @param region 指定位置
     * @return 提取到的文本
     */
    public synchronized String performOCRByRegion(BufferedImage bufferedImage, Rectangle region) {
        String extractedText = "";
        try {
            extractedText = tesseract.doOCR(bufferedImage, region);
        } catch (Exception e) {
            e.printStackTrace();
        }
        extractedText= extractedText.replace("\n","");
        return extractedText;
    }

}

